#include "../libreria.h"
#include "../response_horizontal_flip_image.h"
#include <signal.h>
int s;
void deregistra(int sig_receive)
{
	close(s);
}


int main(int argc, char * argv[])
{
	char msg [BUFFER_SIZE];
	char lunghezza_file [BUFFER_SIZE];
	char nome_servizio [BUFFER_SIZE];
	char ip_service_register [BUFFER_SIZE];
	char nome_immagine_con_path [BUFFER_SIZE];
	char nome_immagine_con_nuovo_path [BUFFER_SIZE];
	int porta_service_register;
	int i;
	
	int r;
	int len_file;
	host service_provider;
	
	signal(SIGINT,deregistra);

	if (argc != 5)
	{
		printf("Errore numero parametri:\nUsage: ./client_horizontal_flip_image ip_service_register porta_service_register nome_servizio nome_immagine.jpg\n");
		exit(1);
	}

	strcpy( ip_service_register, argv[1] );
	porta_service_register = atoi(argv[2]);
	strcpy( nome_servizio, argv[3] );
	strcpy( nome_immagine_con_path, argv[4] );

	/////////// INIZIALIZZAZIONE SOCKET PER CONNESSIONE SERVICE REGISTER /////////////

	s = inizializza_client( ip_service_register, porta_service_register );
	
	////////// INVIO MESSAGGI PER CONTATTARE SERVICE REGISTER //////////////
	
	sprintf( msg, "2;%s#", nome_servizio );
	if(send( s, msg, strlen(msg), 0 ) == -1)
	{
		printf("Errore nell'invio del messaggio per contattare il Service Register\n");
		exit(1);
	}
	/////////// RICEZIONE RISPOSTA DA SERVICE REGISTER ////////////////////
	
	memset( msg, 0, BUFFER_SIZE );

	r = recv ( s, msg, BUFFER_SIZE, 0 );
	if (r == -1)
	{
		printf("Errore ricezione risposta dal Service Register\n");
		exit(1);
	}
	if(msg[0] == '0')
	{ 
		printf("Errore, il servizio richiesto non è disponibile\n");
		exit(1);
	}
	
	decode_msg_from_service_register( msg, service_provider.ip, &service_provider.porta );
	
	close(s);
	
	//////////  CHIUSURA CONNESSIONE SERVICE REGISTER  ///////////////


	////////// INIZIALIZZAZIONE CONNESSIONE SERVICE PROVIDER ///////////////

	service_provider.s = inizializza_client( service_provider.ip, service_provider.porta );	

	printf("CONNESSO con il Service Provider %s:%d\n",service_provider.ip,service_provider.porta);

	////////// INVIO IMMAGINE DA SPECCHIARE AL SERVICE PROVIDER ///////////////
	
	memset( msg, 0, BUFFER_SIZE );

	Response_Horizontal_Flip_Image rhfi(service_provider);

	if (!rhfi.code_request(nome_immagine_con_path))
	{
		printf("Errore nell'invio parametri al service provider\n");
		exit(1);
	}
	
	if (!rhfi.send_image(nome_immagine_con_path))
	{
		printf("Errore nell'invio dell'immagine da specchiare al service provider\n");
		exit(1);
	}

	////////// RICEZIONE IMMAGINE SPECCCHIATA DAL SERVICE PROVIDER ///////////////

	if (!rhfi.decode_response(lunghezza_file)) // ricezione della dimensione dell'immagine specchiata
	{
		printf("Errore: impossibile ricevere immagine specchiata dal service provider\n");
		exit(1);
	}

	len_file = atoi(lunghezza_file);

	if (len_file <= 0)
	{
		printf("Errore: impossibile ricevere immagine specchiata dal service provider\n");
		exit(1);
	}	
	
	//Eliminazione del path contenuto nell'immagine
	i = 0;
	memset( msg, 0, BUFFER_SIZE );
	strcpy( msg, nome_immagine_con_path );
	while (msg[i++] != '/');

	//Inserimento del nuovo path nel nome dell'immagine
	sprintf(nome_immagine_con_nuovo_path,"foto_temp/%s",&msg[i]);

	//ricezione immagine specchiata
	if(!rhfi.receive_image( nome_immagine_con_nuovo_path, len_file ))
		printf("Errore: impossibile salvare il file specchiato %s\n", nome_immagine_con_nuovo_path);
	else
		printf("Immagine specchiata %s ricevuta correttamente!\n", nome_immagine_con_nuovo_path);

	close(service_provider.s); 

}
